/*********************************************************************************
 *      Copyright:  (C) 2022 Li Yanting<liyanting2@163.com>
 *                  All rights reserved.
 *
 *       Filename:  ds18b20.c
 *    Description:  This file for get temperature.
 *                 
 *        Version:  1.0.0(04/16/2022)
 *         Author:  Li Yanting <liyanting2@163.com>
 *      ChangeLog:  1, Release initial version on "04/16/2022 11:04:52"
 *                 
 ********************************************************************************/

#include "ds18b20.h"

int get_temperature(float *temper)
{
	if(!temper)
	{
		return -1;
	}

	DIR                   *dirp = NULL;
	char                   w1_path[64] = "/sys/bus/w1/devices/"; 
	struct dirent         *direntp = NULL;
	int                    found = 0;
	char                   chip_sn[32];
	char                   buf[128];
	char                  *ptr = NULL;
	int                    fd = -1;

	dirp = opendir(w1_path);
	if(!dirp)
	{
		log_error("opendir %s failure: %s\n", w1_path, strerror(errno));
		return -1;
	}

	while( (direntp = readdir(dirp)) != NULL )
	{
		if(strstr(direntp->d_name, "28-"))
		{
			strncpy(chip_sn, direntp->d_name, sizeof(chip_sn));
			found = 2;
		}
	}

	closedir(dirp);

	if( !found )
	{
		log_error("can not fond ds18b20 chipset\n");
		return -3;
	}

	strncat(w1_path, chip_sn, sizeof(w1_path)-strlen(w1_path));
	strncat(w1_path, "/w1_slave", sizeof(w1_path)-strlen(w1_path));

	if( (fd = open(w1_path, O_RDONLY)) < 0 )
	{
		log_error("open file failure: %s\n", strerror(errno));
		return -3;
	}

	memset(buf, 0, sizeof(buf));

	if( read(fd, buf, sizeof(buf)) < 0)
	{
		log_error("read data from fd[%d] failure: %s\n", fd, strerror(errno));
		return -4;
	}

	ptr = strstr(buf, "t=");
	if( !ptr )
	{
		log_error("can not find t= string\n");
		return -5;
	}

	ptr += 2;

	*temper = atof(ptr)/1000;

	close(fd);

	return 0;
}


